package com.pluszg.nutrition.common.utils.json.serializer;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.Objects;

/**
 * 由于有些ID使用分布式唯一算法生成的Long类型，所以有很长（19位数字），
 * 导致转成json传至前端js使用时报错，因为js的数字类型最大只能表示15个数字长度
 * <p>
 * 解决方案：使用Spring自定义的Json序列化，
 * 将过长的Long类型转成String类型给到js使用，这样就不会有问题了
 */
@Slf4j
public class LongSerializer extends StdSerializer<Long> {

    public LongSerializer() {
        super(Long.class);
    }

    @Override
    public void serialize(Long value, JsonGenerator generator, SerializerProvider serializers) throws IOException {
        if (Objects.isNull(value)) {
            generator.writeNull();
        } else if (value.toString().length() > 12) {
            generator.writeString(value.toString());
            log.debug("the Long value [{}] is too long. will convert to String", value);
        } else {
            generator.writeNumber(value);
        }
    }
}
